package com.youlai.jdk;


import org.junit.jupiter.api.Test;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * java8新增的特性
 * Lambda表达式：可以将一个函数作为参数传递给另一个函数，从而简化代码。
 * Stream API：可以对集合进行流式操作，例如过滤、映射、排序等。
 * Date/Time API：提供了新的日期和时间API，可以更方便地处理日期和时间。
 * 接口默认方法：接口可以包含默认方法的实现，从而避免在实现类中重复编写相同的代码。
 * 方法引用：可以使用方法的引用来简化Lambda表达式的书写。
 * Optional类：可以用来处理可能为null的值，从而避免空指针异常。
 * PermGen空间移除：将永久代（PermGen）空间移除，取而代之的是元空间（Metaspace）
 * 并行数组操作：可以对数组进行并行操作，例如排序、查找等。
 *
 * @author zc
 * @date 2023-03-25 13:13
 */
public class Java8 {
    /**
     * Lambda表达式示例，将一个函数作为参数传递给另一个函数
     */
    @Test
    public void lambda() {
        List<String> list = Arrays.asList("hello", "world", "java", "8");
        // 使用lambda表达式
        list.forEach(s -> System.out.println(s));
        // 将lambda表达式作为参数传递给另一个函数
        list.forEach(Java8::print);
    }

    private static void print(String s) {
        System.out.println(s.toUpperCase());
    }


    /**
     * Stream对集合进行流式操作
     */
    @Test
    public void stream() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        // 过滤出偶数
        List<Integer> evenList = list.stream().filter(i -> i % 2 == 0).collect(Collectors.toList());
        System.out.println(evenList);
        // 求和
        int sum = list.stream().mapToInt(Integer::intValue).sum();
        System.out.println(sum);
        // 排序
        List<Integer> sortedList = list.stream().sorted().collect(Collectors.toList());
        System.out.println(sortedList);
    }

    /**
     * Date/Time API示例
     */
    @Test
    public void dateTime() {
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        System.out.println("当前日期：" + currentDate);
        // 获取当前时间
        LocalTime currentTime = LocalTime.now();
        System.out.println("当前时间：" + currentTime);
        // 获取当前日期时间
        LocalDateTime currentDateTime = LocalDateTime.now();
        System.out.println("当前日期时间：" + currentDateTime);
        // 格式化日期时间
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String formattedDateTime = currentDateTime.format(formatter);
        System.out.println("格式化后的日期时间：" + formattedDateTime);
    }


    /**
     * 接口默认方法
     */
    @Test
    public void defaultMethod() {
        Java8.MyInterface myInterface = new Java8.MyInterfaceImpl();
        myInterface.sayHello();
        myInterface.sayHi();
    }

    interface MyInterface {
        default void sayHello() {
            System.out.println("Hello");
        }

        default void sayHi() {
            System.out.println("Hi");
        }
    }

    class MyInterfaceImpl implements Java8.MyInterface {
        // 可以不实现默认方法
    }

    /**
     * 方法引用示例
     */
    @Test
    public void methodReference() {
        List<String> list = Arrays.asList("hello", "world", "java", "8");
        // 使用lambda表达式
        list.forEach(s -> System.out.println(s));
        // 使用方法引用
        list.forEach(System.out::println);
    }

    /**
     * Optional类示例
     */
    @Test
    public void optional() {
        Optional<String> optional = Optional.ofNullable(null);
        // 判断是否有值
        System.out.println(optional.isPresent());
        // 如果有值，输出长度
        System.out.println(optional.map(String::length).orElse(-1));
        // 如果没有值，输出默认值
        System.out.println(optional.orElse("world"));
        // 如果没有值，输出自定义的值
        System.out.println(optional.orElseGet(() -> "nihao"));
        // 如果有值，执行方法
        optional.ifPresent(System.out::println);
    }


    /**
     * 并行操作实现过滤数组
     */
    @Test
    public void parallelFilter() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        // 使用并行流过滤出偶数
        List<Integer> evenList = list.parallelStream().filter(i -> i % 2 == 0).collect(Collectors.toList());
        System.out.println(evenList);
    }

}

